package com.AdvancedDemos.FileAndIO;

import java.io.File;
import java.io.IOException;
import java.util.Date;

public class LearnFile {
    public static void main(String[] args) throws IOException {
        /**
         * File对象用于表示文件路径
         * */
        /*
         * File(String pathname)
         */
        File file = new File("BCD:\\aaa\\bbb\\ccc.txt");//字符串中反斜杠要转义
        System.out.println(file);//BCD:\aaa\bbb\ccc.txt

        /*
         * File(String parent,String child)
         */
        //F:\IntelijIDEA\IntelliJ IDEA 2022.3\IdeaProjects\MyFirstProject\helloworld.app\src\com\AdvancedDemos\FileAndIO\LearnFIle_IO.java
        File file1 = new File("F:\\IntelijIDEA\\IntelliJ IDEA 2022.3\\IdeaProjects\\MyFirstProject\\helloworld.app\\src\\com\\AdvancedDemos", "FileAndIO\\LearnFIle_IO.java");
        System.out.println(file1);//F:\IntelijIDEA\IntelliJ IDEA 2022.3\IdeaProjects\MyFirstProject\helloworld.app\src\com\AdvancedDemos\FileAndIO\LearnFIle_IO.java

        /*
         * File(File parent,String child)
         */
        File parent = new File("F:\\IntelijIDEA\\IntelliJ IDEA 2022.3\\IdeaProjects\\MyFirstProject\\helloworld.app\\src\\com\\AdvancedDemos");
        File file2 = new File(parent, "FileAndIO\\LearnFIle_IO.java");
        System.out.println(file2);//F:\IntelijIDEA\IntelliJ IDEA 2022.3\IdeaProjects\MyFirstProject\helloworld.app\src\com\AdvancedDemos\FileAndIO\LearnFIle_IO.java
        /*
        没有File(File parent,File child)构造函数
         */

        /**
         * 绝对路径:从盘符开始,完整的路径
         * 相对路径:从项目文件夹下一级开始的路径,即相对项目文件夹是固定的,该文件夹位置是可能改变的
         */


        System.out.println("----------------");
        /**
         * 判断及修改操作
         */
        File file3 = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO");
        boolean exists = file3.exists();//判断file对象表示的路径是否存在
        System.out.println(exists);//true

        boolean file4 = file3.isFile();//判断路径是不是文件
        System.out.println(file4);//false

        boolean directory = file3.isDirectory();//判断路径是不是文件夹
        System.out.println(directory);//true

        File file5 = new File("D:\\a\\b\\c\\a.txt");//虚假的路径不会被认为是文件或文件夹
        System.out.println(file5.isFile());//false
        System.out.println(file5.isDirectory());//false

        System.out.println(file3.getName());//FileAndIO   获取路径表示的文件/文件夹名
        System.out.println(file5.getName());//a.txt  即便是虚假路径也能得到文件/文件夹名

        long length = file3.length();//获取文件的字节数
        System.out.println(length);//0 文件夹大小获取不到的,取决于内部存储的文件字节数

        long l = file3.lastModified();//最后一次修改的时间
        System.out.println(l);//1678777583828
        Date date = new Date(l);
        System.out.println(date);//Tue Mar 14 15:07:08 CST 2023

        System.out.println(file5.getPath());//D:\a\b\c\a.txt  获取file对象表示的路径
        System.out.println(file3.getParent());//helloworld\src\com\AdvancedDemos

        System.out.println(file3.getAbsolutePath());//F:\IntelijIDEA\IntelliJ IDEA 2022.3\IdeaProjects\MyFirstProject\helloworld\src\com\AdvancedDemos\FileAndIO
        System.out.println(file5.getAbsolutePath());//D:\a\b\c\a.txt
        //获取File表示的绝对路径
        //如果File表示的相对路径是真实存在的,获取对应的绝对路径
        //表示的相对路径不存在,将项目路径补全到不存在的相对路径之前


        System.out.println("----------------");
        /**
         * 创建及删除操作
         */
        File parent1 = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO");
        System.out.println(parent1.exists());//true
        File file6 = new File(parent1, "a.txt");
        boolean newFile = file6.createNewFile();//创建新文件,成功返回true,失败false
        System.out.println(newFile);//true
        /*
        注意:
        1.创建文件要保证文件父级路径是真实存在的,否则IOException:系统找不到指定的路径
        路径:父级路径 + 文件名.后缀名
        2.父级路径文件夹存在权限,创建失败,IOException:拒绝访问
        3.如果路径表示的文件真实存在,创建也会失败,false
        */
        if (file6.exists()) {
            System.out.println(file6.length());//15 表示a.txt长度是15个字节
        }

        /**
         * 创建文件夹
         */
        File file7 = new File(parent1, "aaa");
        System.out.println(file7.mkdir());//只能创建单级文件夹
        File file8 = new File(parent1, "bbb\\ccc");
        System.out.println(file8.mkdirs());//既能创建单级文件夹,又能创建多级文件夹,不容易报错,不存在就直接创建
        /*
        注意事项:
        1.如果要创建的文件夹路径存在,返回false
        2.使用绝对路径创建文件夹,当盘符不存在时,创建失败,返回false
        3.父级文件夹路径有权限,创建失败,返回false
         */
        System.out.println("//////////////////");

//////////////////////////////////////////////////////////////////////
        /**
         * 案例:
         * 使用File在当前模块的 ccc\\ddd\\eee下创建b.txt
         */
        //创建文件的前提是确保文件父级路径存在
        File parent2 = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\ccc\\ddd\\eee");
        //判断父级路径是否存在
        if (!parent2.exists()) {
            //不存在,就创建路径
            if (parent2.mkdirs()) {
                System.out.println("父级路径创建成功!");
                //创建文件
                File file9 = new File(parent2, "a.txt");
                System.out.println(file9.createNewFile() ? "创建a.txt成功!" : "创建a.txt失败!");
            }
        }

//////////////////////////////////////////////////////////////////////


        System.out.println("//////////////////");

        //public boolean delete():危险操作,删除不走回收站,直接从硬盘删除
        //注意:
        //1.删除要保证文件路径真实存在
        //2.只能删除文件以及空文件夹

        //文件路径不存在,false
        File file9 = new File("H:\\aaa\\bbb\\a.txt");
        boolean delete = file9.delete();
        System.out.println(delete);//false

        //文件路径有权限,false

        //文件夹内有内容(包括文件夹嵌套),false
        File file10 = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\bbb");
        System.out.println(file10.delete());//false

        //删除文件,存在true,不存在false
        File file11 = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\k.txt");
        System.out.println(file11.delete());//true

        //删除空文件夹
        File file12 = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\kkk");
        System.out.println(file12.delete());//true


        System.out.println("----------------");
        String[] list = file3.list();//获取路径包含的文件/文件夹名称
        for (String s : list) {
            System.out.println(s);
            //a.txt
            //aaa
            //bbb
            //LearnFIle_IO.java
        }
        System.out.println("----------------");
        File[] files = file3.listFiles();//获取路径包含的文件路径/文件夹路径
        for (File file13 : files) {
            System.out.println(file13);
            //helloworld\src\com\AdvancedDemos\FileAndIO\a.txt
            //helloworld\src\com\AdvancedDemos\FileAndIO\aaa
            //helloworld\src\com\AdvancedDemos\FileAndIO\bbb
            //helloworld\src\com\AdvancedDemos\FileAndIO\LearnFIle_IO.java
        }
        /*
        listFiles()注意事项:
        1.何时返回数组地址为null
        路径是文件路径
        表示的文件夹路径不存在
        权限不足
        2.何时返回数组长度为0
        路径是空文件夹
        3.何时能够遍历数组获取路径
        排除异常情况
        真实存在,且没有权限限制,有内容的文件夹
         */

    }
}
